package v1

import (
	"auth/authentication"
	"auth/bll"
	"auth/model"
	"auth/server/web/middleware"
	"auth/utils"
	"github.com/gin-gonic/gin"
)

var Menu = &menu{}

type menu struct{}

func (a *menu) Init(r *gin.RouterGroup) {
	g := r.Group("/menu", middleware.Auth())
	{
		g.POST("/create", a.create)
		g.POST("/addMenuAuthority", a.addMenuAuthority)
		g.POST("/delete", a.delete)
		g.POST("/update", a.update)

		g.POST("/getMenu", a.getMenu)                   // 获取菜单树（登录用户菜单树）
		g.POST("/getMenuList", a.getMenuList)           // 分页获取基础menu列表（菜单列表）
		g.POST("/getBaseMenuTree", a.getBaseMenuTree)   // 获取用户动态路由（设置权限菜单数据）
		g.POST("/getMenuAuthority", a.getMenuAuthority) // 获取指定角色menu（指定角色ID菜单树）
		/**g.POST("/getBaseMenuById", a.getBaseMenuById)   // 根据id获取菜单}*/
	}
}

// GetMenu 获取用户动态路由
func (a *menu) getMenu(c *gin.Context) {
	var (
		out = &model.GetMenuListResponse{}
		err error
	)
	//获取登录的用户角色列表
	userID, err := authentication.ContextUserID(c.Request.Context())
	if err != nil {
		c.Error(err)
		return
	}
	if out, err = bll.Menu.GetMenu(userID); err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, out)
}

// GetBaseMenuTree 获取用户动态路由--设置权限
func (a *menu) getBaseMenuTree(c *gin.Context) {
	var (
		err error
		out = &model.SysBaseMenusResponse{}
	)
	out, err = bll.Menu.GetBaseMenuTree()
	if err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, out)
}

// AddMenuAuthority 增加menu和角色关联关系
func (a *menu) addMenuAuthority(c *gin.Context) {
	var (
		in  = &model.AddMenuAuthorityInfoRequest{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}
	if err = bll.Menu.AddMenuAuthority(in); err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, nil)
}

// GetMenuAuthority 获取指定角色menu
func (a *menu) getMenuAuthority(c *gin.Context) {
	var (
		err error
		out = &model.GetMenuAuthorityResponse{}
		in  = &model.GetMenuAuthorityRequest{}
	)
	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}
	out, err = bll.Menu.GetMenuAuthority(in)
	if err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, out)
}

// Create 新增菜单
func (a *menu) create(c *gin.Context) {
	var (
		in  = &model.MenuCreateRequest{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}

	if err = bll.Menu.Create(in); err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, nil)
}

// Delete 删除菜单
func (a *menu) delete(c *gin.Context) {
	var (
		in  = &model.MenuDeleteRequest{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}

	if err = bll.Menu.Delete(in); err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, nil)
}

// Update 修改菜单
func (a *menu) update(c *gin.Context) {
	var (
		in  = &model.MenuUpdateRequest{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}

	if err = bll.Menu.Update(in); err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, nil)
}

// GetBaseMenuById 根据id获取菜单
/*func (a *menu) getBaseMenuById(c *gin.Context) {

}*/

// GetMenuList	分页获取基础menu列表
func (a *menu) getMenuList(c *gin.Context) {
	var (
		in  = &model.MenuListRequest{}
		out = &model.MenuListResponse{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}
	if out, err = bll.Menu.GetMenuList(in); err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOK(c, out)
}
